#include "../mqserver/mq_exchange.hpp"
#include <gtest/gtest.h>

mq::ExchangeManager::ptr emp;

class ExchangeTest : public testing::Environment{
public:
    virtual void SetUp() override{
        emp = std::make_shared<mq::ExchangeManager>("./data/meta.db");
        if(emp.get()== nullptr)
            DLOG("创建失败");
    }
    virtual void TearDown() override{
        // emp->clear();//去除所有数据库
        // DLOG("清除完成");
    }
};

TEST(exchange_test,insert_test){
    //1. 创建 插入4 个交换机
    // std::unordered_map<string,string> map = {{"k1","v1"},{"k2","v2"}};//{}构造

    //附：测试当map值为空的插入
    std::unordered_map<string,string> map;
    //对于之前已存在的值就会不会插入，配合之前删除的也就是重新生成交换机3，并且没有map数据
    emp->declareExchange("exchange1",mq::ExchangeType::DIRECT,true,false,map);
    emp->declareExchange("exchange2",mq::ExchangeType::DIRECT,true,false,map);
    emp->declareExchange("exchange3",mq::ExchangeType::DIRECT,true,false,map);
    emp->declareExchange("exchange4",mq::ExchangeType::DIRECT,true,false,map);
    // 2. 使用ASSERET_EQ 判断 size 是否 等于4
    ASSERT_EQ(emp->size(),4);
}

TEST(exchange_test,select_test){
    //1. 测试查询，因为查询会返回一个交换机所以可以创建一个局部的交换机进行接收
    //这里查询交换机3
    mq::Exchange::ExchangePtr exp = emp->selectExchange("exchange3");
    //2. 判断交换机是否查询成功，如果exp为空表示查询失败
    //使用 ASSERT_NE 判断不等，若不等则则返回true，反之相等返回false
    ASSERT_NE(exp.get(),nullptr);//指针 要不等与 null 才正确，所以使用NE

    //3. 判断查询到的交换机数据和查询的交换机3的数据全部对应
    ASSERT_EQ(exp->name,"exchange3");
    ASSERT_EQ(exp->type,mq::ExchangeType::DIRECT);
    ASSERT_EQ(exp->durable,true);
    ASSERT_EQ(exp->auto_delete,false);
    ASSERT_EQ(exp->getArgs(),"k2=v2&k1=v1&");
}

// TEST(exchange_test,remove_test){
//     //删除交换机3
//     emp->deleteExchange("exchange3");
//     //在创建局部交换机，通过emp查询交换机，通过查看查询结果判断是否删除成功
//     Exchange::ExchangePtr exp = emp->selectExchange("exchange3");

//     ASSERT_EQ(exp.get(),nullptr);//若为空，则表示已经删除了！
//     ASSERT_EQ(emp->exists("exchange3"),false);//判断交管局是否还存在
// }


//测试交换机的使用
int main(int argc,char* argv[]){
    testing::InitGoogleTest(&argc,argv);
    testing::AddGlobalTestEnvironment(new ExchangeTest);

    RUN_ALL_TESTS();

    return 0;
}